package com.zisu.a996.guava;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

/**
 * @Author: 蔡翔
 * @Date: 2019/11/29 13:33
 * @Version 1.0
 *
 * java8 中的Optional使用
 * Optional 是包裹我们需要操作的变量的。
 */
public class OptionalTest {

    @Test
    public void test() throws Exception{
        /**
         * 三种创建Optional对象方式
         **/
        //创建空的Option对象里面没有任何引用。
        Optional.empty();

        //Optional.of() 是不接受null 的，如果传进来一个null 会报空指针异常。
        Optional<String> optionalS = Optional.of("zhangshan");

        //使用任意值创建Optional对象
        Optional.ofNullable(null);

        /**
         * 判断是否引用缺失
         **/
        //和 value!= null 一样的。（建议不适用）
        final boolean present = optionalS.isPresent();

        //ifPresent 意思是当Optional里面的引用 存在时 时调用的方法。
        //类似：map、filter、flatMap
        optionalS.ifPresent(System.out::println);

        //当Optional引用缺失时执行。
        //添一个默认值
        optionalS.orElse("123");
        optionalS.orElseGet(()->{
            //自定义引用缺失时的返回值
            return "自定义引用缺失";
        });
        try {
            final String yy = optionalS.orElseThrow(()  -> {
                throw new RuntimeException("运行异常");
            });
        }catch (Throwable e){

        }
    }

    public static void stream(List<String> list){
        //list.stream().forEach(System.out::println);
        Optional.ofNullable(list)
                //如果Optional引用不为空，那么就会调用这里的map方法。
                //注意这里不是stream()里面的api，里面的参数就是代表Optional的引用内容。调用List::stream 构建出一个流出来。mapping 是映射的意思。
                .map(List::stream)
                //如果list 为null的话，这里就创建一个空的流。
                .orElseGet(Stream::empty)
                .forEach(System.out::println);
        ;
    }
    public static void main(String[] args) {
        stream(null);
    }
}